#include <stdio.h>  
#include <string.h>  
   
typedef unsigned long  ulong;  
   
struct A  
{  
     ulong board_type:       1;  
     ulong channel_type:     3;  
     ulong fpga_en :         1;  
     ulong fpga_downloaded:  1;  
     ulong ds26519A_reset:   1;  
     ulong ds26519B_reset:   1;  
     ulong ds26519C_reset:   1;  
     ulong ds26519D_reset:   1;  
     ulong reserved1:        1; //bit 10   
     ulong reset_bcm :       1;  
     ulong reserved2:        4; //bit 12- bit15   
     ulong reserved3:        16;  
};  


struct A aa;  
int main()  
{  
    memset(&aa, 0xff, sizeof(struct A));  
	aa.fpga_en = 1;
	aa.fpga_downloaded = 1;
    aa.reserved1= 1;
	aa.reserved3=0xffff;
 
    return 0;  
}  


/*

假定文件名叫test_struct_bitw.c,使用如下命令：

#gcc -o test_struct_bitw test_struct_bitw.c -g
#objdump -d test_struct_bitw > 1.txt

这里我们只关心 aa.reserved1= 1; 这句对应的汇编代码,要用到addr2line。我们从反汇编的内容中可以找到 
08048324  <main>: 这句，也就是C代码里main函数入口。凭直觉，可能是 804833c这行，使用命令
#addr2line -e test_struct_bitw  0x804833c ，输出结果是test_struct_bitw.c:28。显然，
我们找到的这句汇编指令就是对应C代码中的28行 aa.reserved1= 1; ，但是不只这一句。同样使用命令
#addr2line -e test_struct_bitw  0x8048343 ，#addr2line -e test_struct_bitw  0x8048346 ，输出结
果都是test_struct_bitw.c:28，也就是说 aa.reserved1= 1; 这句C代码对应的汇编代码是三句，即：

01.804833c:       0f b6 05 35 95 04 08    movzbl 0x8049535,%eax     
02.8048343:       83 c8 04                or     $0x4,%eax     
03.8048346:       a2 35 95 04 08          mov    %al,0x8049535  

8048332:       c7 05 34 95 04 08 00    movl   $0xffffffff,    0x8049534   

8048339:       00 00 00 

不难看出，就是从0x8049535处取了一个字节(原因是成员reserved1是整个32位成员中的第二个字节，所以地址要从0x8049535开始，

同理若是aa.fpga_en= 1;则就应该从0x8049534 处取了)，然后进行按位或操作，最后在把位操作后的结果写回到0x8049535地址中去。

这里的关键在于要理解  804833c:   0f b6 05 35 95 04 08    movzbl 0x8049535, %eax 这句汇编代码，

意思是从0x8049535的内存空间中取一个字节，其余位填0,32位的数据放到eax寄存器中。








*/
